import pretty_midi
from pygame import mixer  # 加载 Pygame 混音器库
import time
import py5

# 创建一个新的 PrettyMIDI 对象
midi_data = pretty_midi.PrettyMIDI()

# 添加一个乐器，这里我们选择电吉他作为主要乐器
electric_guitar = pretty_midi.Instrument(program=25)  # Program 25 是 Electric Guitar (jazz)

# 定义一些摇滚风格的音符
rock_riff = [
    {'note': 60, 'start': 0.0, 'end': 0.5},  # C4
    {'note': 64, 'start': 0.5, 'end': 1.0},  # E4
    {'note': 67, 'start': 1.0, 'end': 1.5},  # G4
    {'note': 69, 'start': 1.5, 'end': 2.0},  # A4
    {'note': 67, 'start': 2.0, 'end': 2.5},  # G4
    {'note': 64, 'start': 2.5, 'end': 3.0},  # E4
]

# 将音符添加到乐器中
for note in rock_riff:
    note_obj = pretty_midi.Note(
        velocity=100, pitch=note['note'], start=note['start'], end=note['end'])
    electric_guitar.notes.append(note_obj)

# 把乐器加入到 MIDI 数据中
midi_data.instruments.append(electric_guitar)

# 将 MIDI 文件保存为 'rock_riff.mid'
output_midi_file = 'rock_riff.mid'
midi_data.write(output_midi_file)
print(f"Created rock riff and saved to {output_midi_file}")

# 使用 Pygame 播放刚刚创建的 MIDI 文件，并设置为循环播放
mixer.init()
mixer.music.load(output_midi_file)
mixer.music.play(-1)  # -1 表示无限次循环播放

# 计时器变量
last_clear_time = time.time()

def setup():
    global last_clear_time
    py5.size(800, 600)
    py5.stroke(0)
    py5.background(0)
    py5.frame_rate(30)
    last_clear_time = time.time()  # 初始化计时器

def draw():
    global last_clear_time
    
    # 清理屏幕逻辑：每10秒清理一次屏幕
    current_time = time.time()
    if current_time - last_clear_time >= 10:
        py5.background(0)  # 重置背景颜色，清屏
        last_clear_time = current_time  # 重置计时器
    
    x1, y1 = py5.random(py5.width), py5.random(py5.height)
    x2, y2 = py5.random(py5.width), py5.random(py5.height)
    color = py5.color(py5.random(255), py5.random(255), py5.random(255))
    py5.stroke(color)
    py5.line(x1, y1, x2, y2)

# 启动 py5 sketch
py5.run_sketch()

# 等待用户中断
try:
    while True:  # 因为音乐会循环播放，所以这里我们无限等待
        time.sleep(1)
except KeyboardInterrupt:
    print("Playback stopped by user.")
    mixer.music.stop()
